package com.myStorebillProvider.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.myStorebillProvider.entity.BillEcharts;
import com.myStorebillProvider.mapper.MyStorebillMapper;
import com.myStorebillProvider.utils.GetDateUtil;
import entity.ResponseMessage;
import entity.StatusCode;
import entity.Storebill;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import service.mystore.MyStorebillService;
import util.CropStringUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;

/**
 * @author oahner
 * @create 2022-04-14 14:17
 */
@Service
public class MyStorebillServiceImpl implements MyStorebillService {

    private Logger logger = Logger.getLogger(getClass());

    @Autowired
    private MyStorebillMapper mapper;

    /**
     * 获取我的门店账单流水
     * @param storebillPage (门店账单+分页)
     * @return
     */
    @Override
    public ResponseMessage getMyStorebill(Map<String,Object> storebillPage) {
        logger.info("MyStorebillServiceImpl getMyStorebill params:storebillPage="+storebillPage);
        ResponseMessage msg = new ResponseMessage();
        msg.setFlag(false);
        msg.setCode(StatusCode.ERROR);
        Storebill storebill = null;
        Integer pageNum = 1;
        if(null!=storebillPage.get("storebill")){
            storebill = JSONObject.parseObject(JSONObject.toJSONString(storebillPage.get("storebill")), Storebill.class);
            storebill = (Storebill) CropStringUtil.cropString(storebill);
        }
        if(null!=storebillPage.get("pageNum") && (Integer)storebillPage.get("pageNum")>0){
            pageNum = (Integer) storebillPage.get("pageNum");
        }
        try {
            if(null!=storebill.getStoreId() && !"".equals(storebill.getStoreId())) {
                PageHelper.startPage(pageNum,10);
                List<Storebill> storebills = mapper.selMyStorebill(storebill);
                if (null!=storebills && storebills.size() > 0) {
                    PageInfo<Storebill> pageInfo = new PageInfo<Storebill>(storebills);
                    msg.setFlag(true);
                    msg.setCode(StatusCode.OK);
                    msg.setMessage("select myStorebill success");
                    msg.setData(pageInfo);
                    logger.debug("MyStorebillServiceImpl getMyStorebill if(!null) result:msg=" + msg);
                } else {
                    msg.setMessage("select myStorebill is empty");
                    logger.debug("MyStorebillServiceImpl getMyStorebill if(null) result:storebill=" + storebill);
                }
            }else{
                msg.setMessage("select myStorebill storeID is empty");
                logger.debug("MyStorebillServiceImpl getMyStorebill idnull result:storebill=" + storebill);
            }
        } catch (Exception e) {
            e.printStackTrace();
            msg.setMessage("select myStorebill is error");
            logger.error("MyStorebillServiceImpl getMyStorebill error parmas:storebill="+storebill,e);
        }
        return msg;
    }

    /**
     * 获取我的门店账单流水（近7天）
     * @param storebill
     * @return
     */
    @Override
    public ResponseMessage getMyStorebillInLastW(Storebill storebill) {
        logger.info("MyStorebillServiceImpl getMyStorebillInLastW params:storebill="+storebill);
        ResponseMessage msg = new ResponseMessage();
        msg.setFlag(false);
        msg.setCode(StatusCode.ERROR);
        try {
            //获取最近7天的日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            ArrayList<String> days = GetDateUtil.getDays(7);
            //账单数据（渲染折线图）
            Map<String,List> billMap = new HashMap<>();
            billMap.put("date",days);
            List<Object> billEcharts = new ArrayList<>();
            //判断是否有门店ID，没有就不进行获取账单操作
            if(null!=storebill.getStoreId() && !"".equals(storebill.getStoreId())) {
                List<Storebill> storebills = mapper.selMyStorebillInLastW(storebill);
                //折线图渲染数据对象（收入）
                BillEcharts sbillEcharts = new BillEcharts();
                List<String> slist = new ArrayList<>();
                sbillEcharts.setName("收入");
                //折线图渲染数据对象（支出）
                BillEcharts zbillEcharts = new BillEcharts();
                List<String> zlist = new ArrayList<>();
                zbillEcharts.setName("支出");
                //循环匹配日期，放入对应日期和状态的数据
                for(int i = 0;i<days.size();i++){
                    for (Storebill fstorebill : storebills) {
                        if(null!=fstorebill && fstorebill.getStatus() == 0 && sdf.format(fstorebill.getCreateTime()).equals(days.get(i))){
                            zlist.add(i,fstorebill.getMoney().toString());

                        }else if(null!=fstorebill && fstorebill.getStatus() == 1 && sdf.format(fstorebill.getCreateTime()).equals(days.get(i))){
                            slist.add(i,fstorebill.getMoney().toString());
                        }
                    }
                    if(zlist.size()<i+1 || zlist.size()==0){
                        zlist.add(i,"0");
                    }
                    if(slist.size()<i+1 || slist.size()==0){
                        slist.add(i,"0");
                    }
                }
                //结合日期和状态，封装数据
                sbillEcharts.setData(slist);
                zbillEcharts.setData(zlist);
                billEcharts.add(sbillEcharts);
                billEcharts.add(zbillEcharts);
                billMap.put("data",billEcharts);
                if (null!=storebills && storebills.size() > 0) {
                    msg.setFlag(true);
                    msg.setCode(StatusCode.OK);
                    msg.setMessage("select myStorebillInLastW success");
                    msg.setData(billMap);
                    logger.debug("MyStorebillServiceImpl getMyStorebillInLastW if(!null) result:msg=" + msg);
                } else {
                    msg.setMessage("select myStorebillInLastW is empty");
                    logger.debug("MyStorebillServiceImpl getMyStorebillInLastW if(null) result:storebill=" + storebill);
                }
            }else{
                msg.setMessage("select myStorebillInLastW storeID is empty");
                logger.debug("MyStorebillServiceImpl getMyStorebillInLastW idnull result:storebill=" + storebill);
            }
        } catch (Exception e) {
            e.printStackTrace();
            msg.setMessage("select myStorebill is error");
            logger.error("MyStorebillServiceImpl getMyStorebill error parmas:storebill="+storebill,e);
        }
        return msg;
    }

    /**
     * 获取我的门店账单流水（上月）
     * @param storebill
     * @return
     */
    @Override
    public ResponseMessage getMyStorebillInLastM(Storebill storebill) {
        logger.info("MyStorebillServiceImpl getMyStorebillInLastM params:storebill="+storebill);
        ResponseMessage msg = new ResponseMessage();
        msg.setFlag(false);
        msg.setCode(StatusCode.ERROR);
        try {
            if(null!=storebill.getStoreId() && !"".equals(storebill.getStoreId())) {
                List<BillEcharts> storebills = mapper.selMyStorebillInLastM(storebill);
                if (null!=storebills && storebills.size() > 0) {
                    msg.setFlag(true);
                    msg.setCode(StatusCode.OK);
                    msg.setMessage("select myStorebillInLastM success");
                    msg.setData(storebills);
                    logger.debug("MyStorebillServiceImpl getMyStorebillInLastM if(!null) result:msg=" + msg);
                } else {
                    msg.setMessage("select myStorebillInLastM is empty");
                    logger.debug("MyStorebillServiceImpl getMyStorebillInLastM if(null) parmas:storebill=" + storebill);
                }
            }else{
                msg.setMessage("select myStorebillInLastM storeID is empty");
                logger.debug("MyStorebillServiceImpl getMyStorebillInLastM idnull parmas:storebill=" + storebill);
            }
        } catch (Exception e) {
            e.printStackTrace();
            msg.setMessage("select myStorebillInLastM is error");
            logger.error("MyStorebillServiceImpl getMyStorebillInLastM error parmas:storebill="+storebill,e);
        }
        return msg;
    }
}
